// app/api/projects/[projectId]/cover/route.ts import { NextRequest, NextResponse } from "next/server" import { generateCoverPage } from "@/lib/cover/cover-service" /** * 커버페이지 생성 및 다운로드 * * GET /api/projects/[projectId]/cover?docNumber=DOC-001 * * @param projectId - 프로젝트 ID * @param docNumber - 문서 번호 (쿼리 파라미터) */ export async function GET( request: NextRequest, { params }: { params: Promise<{ projectId: string }> } ) { try { const { projectId: projectIdParam } = await params const projectId = parseInt(projectIdParam) if (isNaN(projectId)) { return NextResponse.json( { success: false, message: "유효하지 않은 프로젝트 ID입니다" }, { status: 400 } ) } // docNumber 쿼리 파라미터 가져오기 const { searchParams } = new URL(request.url) const docNumber = searchParams.get("docNumber") if (!docNumber) { return NextResponse.json( { success: false, message: "문서 번호(docNumber)가 필요합니다" }, { status: 400 } ) } console.log(`📄 커버페이지 요청 - ProjectID: ${projectId}, DocNumber: ${docNumber}`) // 커버페이지 생성 const result = await generateCoverPage(projectId, docNumber) if (!result.success || !result.buffer) { return NextResponse.json( { success: false, message: result.error || "커버페이지 생성 실패" }, { status: 500 } ) } // DOCX 파일로 응답 // Buffer를 Uint8Array로 변환 const uint8Array = new Uint8Array(result.buffer) return new NextResponse(uint8Array, { status: 200, headers: { "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "Content-Disposition": `attachment; filename="${encodeURIComponent(result.fileName || "cover.docx")}"`, "Content-Length": result.buffer.length.toString(), }, }) } catch (error) { console.error("❌ 커버 페이지 생성 오류:", error) return NextResponse.json( { success: false, message: error instanceof Error ? error.message : "생성 중 오류 발생" }, { status: 500 } ) } }